package com.hbnu.common.response;

/**
 * 服务响应
 *
 * @param <T>
 */
public class ServiceResponse<T> {
    private final T data;
    private final String alertMessage;
    private final String errorMessage;

    /**
     * 创建一个服务响应对象
     *
     * @param data          响应数据
     * @param alertMessage  提示信息
     * @param errorMessage  错误信息
     */
    public ServiceResponse(T data, String alertMessage, String errorMessage) {
        this.data = data;
        this.alertMessage = alertMessage;
        this.errorMessage = errorMessage;
    }

    /**
     * 判断服务响应是否成功
     *
     * @return true表示成功，false表示失败
     */
    public boolean isSuccess() {
    	return errorMessage == null;
    }

    /**
     * 获取响应数据
     *
     * @return 响应数据
     */
    public T getData() {
        return data;
    }

    /**
     * 获取提示信息
     *
     * @return 提示信息
     */
    public String getAlertMessage() {
        return alertMessage;
    }

    /**
     * 获取错误信息
     *
     * @return 错误信息
     */
    public String getErrorMessage() {
        return errorMessage;
    }

    /**
     * 创建一个成功的服务响应对象
     *
     * @param <T> 响应数据类型
     * @return 服务响应对象
     */
    public static <T> ServiceResponse<T> success() {
        return new ServiceResponse<>(null, null, null);
    }

    /**
     * 创建一个成功并携带数据的服务响应对象
     *
     * @param <T> 响应数据类型
     * @param data 响应数据
     * @return 服务响应对象
     */
    public static <T> ServiceResponse<T> success(T data) {
    	return new ServiceResponse<>(data, null, null);
    }

    /**
     * 创建一个成功并携带提示信息的服务响应对象
     *
     * @param <T> 响应数据类型
     * @param alertMessage 提示信息
     * @return 服务响应对象
     */
    public static <T> ServiceResponse<T> success(String alertMessage) {
        return new ServiceResponse<>(null, alertMessage, null);
    }

    /**
     * 创建一个成功并携带数据及提示信息的服务响应对象
     *
     * @param <T> 响应数据类型
     * @param data 响应数据
     * @param alertMessage 提示信息
     * @return 服务响应对象
     */
    public static <T> ServiceResponse<T> success(T data, String alertMessage) {
        return new ServiceResponse<>(data, alertMessage, null);
    }

    /**
     * 创建一个失败的服务响应对象
     *
     * @param <T> 响应数据类型
     * @param errorMessage 错误信息
     * @return 服务响应对象
     */
    public static <T> ServiceResponse<T> fail(String errorMessage) {
    	return new ServiceResponse<>(null, null, errorMessage);
    }
}
